package com.yan.design.two.establish.s1.single;

/**
 * 创建型模式：一.单例模式
 *      分为有8种方式：
 *      1. 饿汉式（静态常量）
 *      2. 饿汉式（静态代码块）
 *      3. 懒汉式（线程不安全）
 *      4. 懒汉式（线程安全，同步方法）
 *      5. 懒汉式（线程安全，同步代码块）
 *      6. 双重检测
 *      7. 静态内部类
 *      8. 枚举
 * @author shengren.yan
 * @create 2022-07-14
 */
public class Single1 {

    public static void main(String[] args) {

        // 1. 饿汉式（静态常量） 单例，只存在一个对象实例
        Single s1 = Single.getInstance();
        Single s2 = Single.getInstance();
        System.out.println(s1==s2);
        s1.id=3;
        System.out.println(s2.id);

        // 2 饿汉式（静态代码块）
        Single2 ss1 = Single2.getInstance();
        Single2 ss2 = Single2.getInstance();
        System.out.println(ss1==ss2);
        ss1.id=3;
        System.out.println(ss2.id);

    }


    // 1 饿汉式（静态常量）
    static class Single{
        // 构造方法私有 - 防止对象被new出来，需要去掉static
        private Single(){ }
        private final static Single single = new Single();
        private Integer id;
        public static Single getInstance() {
            return single;
        }
        public  Integer getIn() {
            return id;
        }
    }

    // 2 饿汉式（静态代码块）
    static class Single2{
        // 构造方法私有
        private Single2(){ }
        private Integer id;
        private static Single2 single;
        static {
            single = new Single2();
        }
        public static Single2 getInstance() {
            return single;
        }
        public  Integer getIn() {
            return id;
        }
    }


}
